package com.itheima.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

/**
 * mybatis的工具类:
 *   它要把读取mybatis核心配置文件和创建SqlSessionFactory的工作接管。
 *   并且保证只执行一次。
 *   同时还要提供以下方法：
 *          获取sqlSession
 *          提交事务
 *          回滚事务
 *          释放资源
 * @author 黑马程序员
 * @Company http://www.itheima.com
 */
public class MybatisUtils {

    private static InputStream in = null;
    private static SqlSessionFactory factory;
    /**
     * 静态代码块用于保证，读取核心配置文件和创建SqlSessionFactory只执行一次。
     */
    static {
        try {
            //1.读取核心配置文件
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            //2.创建构建者对象
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            //3.创建工厂对象
            factory = builder.build(in);
        }catch (Exception e){
            e.printStackTrace();
            throw new ExceptionInInitializerError("初始化失败！");
        }finally {
            try{
                in.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    /**
     * 从工厂中获取一个新的SqlSession
     * @return
     */
    public static SqlSession openSession(){
        //4.返回工厂创建的一个新的SqlSession
        return factory.openSession();
    }

    /**
     * 提交事务
     * @param sqlSession
     */
    public static void commit(SqlSession sqlSession){
        sqlSession.commit();
    }

    /**
     * 回滚事务
     * @param sqlSession
     */
    public static void rollback(SqlSession sqlSession){
        sqlSession.rollback();
    }

    /**
     * 释放资源
     * @param sqlSession
     */
    public static void close(SqlSession sqlSession){
        sqlSession.close();
    }
}
